{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "67dbfe44",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os, sys, math, random\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from dataclasses import dataclass\n",
    "from typing import List, Tuple\n",
    "from datasets import load_dataset\n",
    "\n",
    "# Point PYTHONPATH to your TTML build (adjust if your path differs)\n",
    "sys.path.append(f'{os.environ[\"TT_METAL_HOME\"]}/tt-train/sources/ttml')\n",
    "import ttml\n",
    "\n",
    "# Repro\n",
    "def set_seed(seed: int = 42):\n",
    "    random.seed(seed)\n",
    "    np.random.seed(seed)\n",
    "    ttml.autograd.AutoContext.get_instance().set_seed(seed)\n",
    "\n",
    "set_seed(42)\n",
    "\n",
    "# MNIST constants\n",
    "NUM_CLASSES = 10\n",
    "IMG_H, IMG_W = 28, 28\n",
    "N_FEATURES = IMG_H * IMG_W  # 784\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "629379e5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((60000, 784), (60000,), (10000, 784), (10000,))"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def load_mnist() -> Tuple[np.ndarray, np.ndarray, np.ndarray, np.ndarray]:\n",
    "    \"\"\"\n",
    "    Returns:\n",
    "        x_train [Ntr, 784] float32 in [0,1]\n",
    "        y_train [Ntr] int32  (class indices)\n",
    "        x_test  [Nte, 784] float32 in [0,1]\n",
    "        y_test  [Nte] int32\n",
    "    \"\"\"\n",
    "    ds = load_dataset(\"mnist\")\n",
    "\n",
    "    x_train = np.stack([np.array(img, dtype=np.float32) for img in ds[\"train\"][\"image\"]], axis=0)\n",
    "    y_train = np.array(ds[\"train\"][\"label\"], dtype=np.uint32)\n",
    "    x_test  = np.stack([np.array(img, dtype=np.float32) for img in ds[\"test\"][\"image\"]], axis=0)\n",
    "    y_test  = np.array(ds[\"test\"][\"label\"],  dtype=np.uint32)\n",
    "\n",
    "    # scale to [0,1] and flatten\n",
    "    x_train = (x_train / 255.0).reshape(-1, N_FEATURES).astype(np.float32)\n",
    "    x_test  = (x_test  / 255.0).reshape(-1, N_FEATURES).astype(np.float32)\n",
    "    return x_train, y_train, x_test, y_test\n",
    "\n",
    "x_train, y_train, x_test, y_test = load_mnist()\n",
    "\n",
    "# Optional quick smoke test to speed things up while iterating\n",
    "# take = 10_000\n",
    "# x_train, y_train = x_train[:take], y_train[:take]\n",
    "x_train.shape, y_train.shape, x_test.shape, y_test.shape\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "88930b0f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<module '_ttml.modules'>\n",
      "2025-09-29 19:15:40.987 | info     |          Device | Opening user mode device driver (tt_cluster.cpp:188)\n",
      "2025-09-29 19:15:41.136 | info     |   SiliconDriver | Harvesting mask for chip 0 is 0x200 (NOC0: 0x200, simulated harvesting mask: 0x0). (cluster.cpp:403)\n",
      "2025-09-29 19:15:41.269 | warning  |   SiliconDriver | init_detect_tt_device_numanodes(): Could not determine NumaNodeSet for TT device (physical_device_id: 0 pci_bus_id: 0000:04:00.0) (cpuset_lib.cpp:578)\n",
      "2025-09-29 19:15:41.269 | warning  |   SiliconDriver | Could not find NumaNodeSet for TT Device (physical_device_id: 0 pci_bus_id: 0000:04:00.0) (cpuset_lib.cpp:182)\n",
      "2025-09-29 19:15:41.270 | warning  |   SiliconDriver | bind_area_memory_nodeset(): Unable to determine TT Device to NumaNode mapping for physical_device_id: 0. Skipping membind. (cpuset_lib.cpp:463)\n",
      "2025-09-29 19:15:41.270 | warning  |   SiliconDriver | ---- ttSiliconDevice::init_hugepage: bind_area_to_memory_nodeset() failed (physical_device_id: 0 ch: 0). Hugepage allocation is not on NumaNode matching TT Device. Side-Effect is decreased Device->Host perf (Issue #893). (sysmem_manager.cpp:214)\n",
      "2025-09-29 19:15:41.271 | info     |   SiliconDriver | Opening local chip ids/PCIe ids: {0}/[0] and remote chip ids {} (cluster.cpp:252)\n",
      "2025-09-29 19:15:41.271 | info     |   SiliconDriver | All devices in cluster running firmware version: 18.8.0 (cluster.cpp:232)\n",
      "2025-09-29 19:15:41.271 | info     |   SiliconDriver | IOMMU: disabled (cluster.cpp:173)\n",
      "2025-09-29 19:15:41.271 | info     |   SiliconDriver | KMD version: 2.3.0 (cluster.cpp:176)\n",
      "2025-09-29 19:15:41.272 | info     |   SiliconDriver | Software version 6.0.0, Ethernet FW version 7.0.0 (Device 0) (cluster.cpp:1062)\n",
      "2025-09-29 19:15:41.283 | info     |   SiliconDriver | Pinning pages for Hugepage: virtual address 0x7f9700000000 and size 0x40000000 pinned to physical address 0x240000000 (pci_device.cpp:551)\n",
      "2025-09-29 19:15:41.310 | info     |       Inspector | Inspector RPC server listening on localhost:50051 (rpc_server_controller.cpp:85)\n",
      "2025-09-29 19:15:42.572 | info     |           Metal | DPRINT enabled on device 0, worker core (x=0,y=0) (virtual (x=18,y=18)). (dprint_server.cpp:726)\n",
      "2025-09-29 19:15:42.572 | info     |           Metal | DPRINT Server attached device 0 (dprint_server.cpp:773)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/tmp/ipykernel_1507433/1582138588.py:65: DeprecationWarning: Conversion of an array with ndim > 0 to a scalar is deprecated, and will error in future. Ensure you extract a single element from your array before performing this operation. (Deprecated NumPy 1.25.)\n",
      "  loss_val = float(loss.to_numpy())\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[epoch 1/10] step=  100 loss=0.343750\n",
      "[epoch 1/10] step=  200 loss=0.235352\n",
      "[epoch 1/10] step=  300 loss=0.094727\n",
      "[epoch 1/10] step=  400 loss=0.087402\n",
      "[epoch 2/10] step=  500 loss=0.125977\n",
      "[epoch 2/10] step=  600 loss=0.324219\n",
      "[epoch 2/10] step=  700 loss=0.104980\n",
      "[epoch 2/10] step=  800 loss=0.062012\n",
      "[epoch 2/10] step=  900 loss=0.133789\n",
      "[epoch 3/10] step= 1000 loss=0.080566\n",
      "[epoch 3/10] step= 1100 loss=0.072754\n",
      "[epoch 3/10] step= 1200 loss=0.034180\n",
      "[epoch 3/10] step= 1300 loss=0.042480\n",
      "[epoch 3/10] step= 1400 loss=0.064941\n",
      "[epoch 4/10] step= 1500 loss=0.076660\n",
      "[epoch 4/10] step= 1600 loss=0.038086\n",
      "[epoch 4/10] step= 1700 loss=0.028931\n",
      "[epoch 4/10] step= 1800 loss=0.027222\n",
      "[epoch 5/10] step= 1900 loss=0.034424\n",
      "[epoch 5/10] step= 2000 loss=0.033447\n",
      "[epoch 5/10] step= 2100 loss=0.091309\n",
      "[epoch 5/10] step= 2200 loss=0.136719\n",
      "[epoch 5/10] step= 2300 loss=0.060059\n",
      "[epoch 6/10] step= 2400 loss=0.071777\n",
      "[epoch 6/10] step= 2500 loss=0.029541\n",
      "[epoch 6/10] step= 2600 loss=0.015564\n",
      "[epoch 6/10] step= 2700 loss=0.023193\n",
      "[epoch 6/10] step= 2800 loss=0.019653\n",
      "[epoch 7/10] step= 2900 loss=0.002777\n",
      "[epoch 7/10] step= 3000 loss=0.041748\n",
      "[epoch 7/10] step= 3100 loss=0.009033\n",
      "[epoch 7/10] step= 3200 loss=0.085938\n",
      "[epoch 8/10] step= 3300 loss=0.010132\n",
      "[epoch 8/10] step= 3400 loss=0.018555\n",
      "[epoch 8/10] step= 3500 loss=0.001617\n",
      "[epoch 8/10] step= 3600 loss=0.033447\n",
      "[epoch 8/10] step= 3700 loss=0.009888\n",
      "[epoch 9/10] step= 3800 loss=0.031982\n",
      "[epoch 9/10] step= 3900 loss=0.060791\n",
      "[epoch 9/10] step= 4000 loss=0.039795\n",
      "[epoch 9/10] step= 4100 loss=0.020630\n",
      "[epoch 9/10] step= 4200 loss=0.061523\n",
      "[epoch 10/10] step= 4300 loss=0.001465\n",
      "[epoch 10/10] step= 4400 loss=0.047607\n",
      "[epoch 10/10] step= 4500 loss=0.178711\n",
      "[epoch 10/10] step= 4600 loss=0.005371\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "(4690, [2.171875, 2.15625, 2.171875])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "@dataclass\n",
    "class TTMLConfig:\n",
    "    batch_size: int = 128\n",
    "    epochs: int = 10\n",
    "    lr: float = 0.1\n",
    "    momentum: float = 0.9\n",
    "    weight_decay: float = 0.0\n",
    "    dampening: float = 0.0\n",
    "    nesterov: bool = False\n",
    "    seed: int = 42\n",
    "    log_every: int = 100  # print every N steps\n",
    "\n",
    "def train_ttml_linear_classifier_ce(\n",
    "    x_train: np.ndarray,\n",
    "    y_train: np.ndarray,\n",
    "    cfg: TTMLConfig,\n",
    ") -> Tuple[object, List[float]]:\n",
    "    \"\"\"\n",
    "    Trains a mlp(784 ->128 -> 128 -> 10) with cross-entropy loss.\n",
    "    TTML tensor shapes used here:\n",
    "      inputs  : [B, 1, 1, 784]  (float32)\n",
    "      targets : [B, 1, 1, 1]    (int32 class indices)\n",
    "    If your CE expects shape [B] instead, you can squeeze before creating the TTML tensor.\n",
    "    \"\"\"\n",
    "    set_seed(cfg.seed)\n",
    "\n",
    "    #model = ttml.modules.create_linear_regression_model(N_FEATURES, NUM_CLASSES)\n",
    "    model_params = ttml.models.mlp.MultiLayerPerceptronParameters.create(784, np.array([128, 128], dtype=np.uint32).tolist(), 10)\n",
    "    \n",
    "    model = ttml.models.mlp.create_mlp_model(model_params)\n",
    "    loss_fn = ttml.ops.loss.cross_entropy_loss  # logits + int32 targets\n",
    "    opt_cfg = ttml.optimizers.SGDConfig.make(\n",
    "        cfg.lr, cfg.momentum, cfg.weight_decay, cfg.dampening, cfg.nesterov\n",
    "    )\n",
    "    opt = ttml.optimizers.SGD(model.parameters(), opt_cfg)\n",
    "    model.train()\n",
    "\n",
    "    num_samples = x_train.shape[0]\n",
    "    indices = np.arange(num_samples)\n",
    "    losses: List[float] = []\n",
    "    step = 0\n",
    "\n",
    "    for epoch in range(cfg.epochs):\n",
    "        np.random.shuffle(indices)\n",
    "        pos = 0\n",
    "        while pos < num_samples:\n",
    "            end_pos = min(num_samples, pos + cfg.batch_size)\n",
    "            batch_idx = indices[pos:end_pos]\n",
    "            bsz = end_pos - pos\n",
    "\n",
    "            xb = x_train[batch_idx].reshape(bsz, 1, 1, N_FEATURES).astype(np.float32)\n",
    "            # Cross-entropy targets must be INT32 class indices:\n",
    "            yb_idx = y_train[batch_idx].reshape(bsz, 1).astype(np.uint32)\n",
    "\n",
    "            tt_x = ttml.autograd.Tensor.from_numpy(xb, ttml.Layout.TILE, ttml.autograd.DataType.BFLOAT16)\n",
    "            tt_y_idx = ttml.autograd.Tensor.from_numpy(yb_idx, ttml.Layout.ROW_MAJOR, ttml.autograd.DataType.UINT32)  # INT32 tensor\n",
    "\n",
    "            opt.zero_grad()\n",
    "            logits = model(tt_x)  # [B,1,1,10] raw logits\n",
    "            loss = loss_fn(logits, tt_y_idx, ttml.ops.ReduceType.MEAN)\n",
    "            loss.backward(False)\n",
    "            opt.step()\n",
    "\n",
    "            step += 1\n",
    "            loss_val = float(loss.to_numpy())\n",
    "            losses.append(loss_val)\n",
    "            if cfg.log_every and (step % cfg.log_every == 0):\n",
    "                print(f\"[epoch {epoch+1}/{cfg.epochs}] step={step:5d} loss={loss_val:.6f}\")\n",
    "\n",
    "            pos = end_pos\n",
    "\n",
    "    model.eval()\n",
    "    return model, losses\n",
    "\n",
    "cfg = TTMLConfig(epochs=10, batch_size=128, lr=0.1, log_every=100)\n",
    "print(ttml.modules)\n",
    "model, losses = train_ttml_linear_classifier_ce(x_train, y_train, cfg)\n",
    "len(losses), losses[:3]\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "4910213d",
   "metadata": {},
   "outputs": [],
   "source": [
    "def predict_logits_ttml(model, x: np.ndarray, batch_size: int = 2048) -> np.ndarray:\n",
    "    out = []\n",
    "    n = x.shape[0]\n",
    "    pos = 0\n",
    "    while pos < n:\n",
    "        end_pos = min(n, pos + batch_size)\n",
    "        bsz = end_pos - pos\n",
    "        xb = x[pos:end_pos].reshape(bsz, 1, 1, N_FEATURES).astype(np.float32)\n",
    "        tt_x = ttml.autograd.Tensor.from_numpy(xb, ttml.Layout.TILE, ttml.autograd.DataType.BFLOAT16)\n",
    "        logits = model(tt_x).to_numpy().reshape(bsz, NUM_CLASSES)\n",
    "        out.append(logits)\n",
    "        pos = end_pos\n",
    "    return np.concatenate(out, axis=0)\n",
    "\n",
    "def softmax(z: np.ndarray, axis: int = -1) -> np.ndarray:\n",
    "    zmax = np.max(z, axis=axis, keepdims=True)\n",
    "    ez = np.exp(z - zmax)\n",
    "    return ez / np.sum(ez, axis=axis, keepdims=True)\n",
    "\n",
    "def accuracy(pred: np.ndarray, true: np.ndarray) -> float:\n",
    "    return float(np.mean(pred == true))\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d3ddf47c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Test accuracy: 97.21%\n"
     ]
    },
    {
     "data": {
      "image/png": "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gkuKERERkREx2ElI1ceOTXZERERkBAx2ErLgpVgiIiIyIgY7Ccl4KZaIiIiMiMFOQmyxIyIiImNisJMQpzshIiIiY2Kwk5CFBScoJiIiIuNhsJMQL8USERGRMTHYSYjz2BEREZExMdhJiPPYERERkTEx2EmIS4oRERGRMTHYSYiXYomIiMiYGOwkxMETREREZEwMdhLiPHZERERkTAx2Enrex47BjoiIiKTHYCchXoolIiIiY2KwkxAHTxAREZExMdhJSLWkGJvsiIiIyAgY7CSkvBQrV5i4ECIiIqoQGOwkJFOOigVb7IiIiEh6DHYSepbrwC52REREZAwMdhJSttgRERERGQODnYRkz9rsOEExERERGQODnYRUK0+YtgwiIiKqIBjspMSVJ4iIiMiIGOwkxMETREREZEwMdhKS8VIsERERGRGDnYSUExSzxY6IiIiMgcFOQs9nO2GyIyIiIukx2ElIeSlWwSXFiIiIyAgY7CQkU16KZYsdERERGQGDnRGwjx0REREZA4OdhFSDJ0xcBxEREVUMDHYSUk13wmRHRERERsBgJ6HnExQz2REREZH0GOwkxAmKiYiIyJgY7CQkg3KCYkY7IiIikh6DnYTYYkdERETGxGAnIeU8dgomOyIiIjICBjsJcfAEERERGRODnYR4KZaIiIiMicFOQhZMdkRERGREDHYSep7rmOyIiIhIegx2ElL2sVMoTFoGERERVRAMdlJSrRXLFjsiIiKSHoOdhJ6PijVpGURERFRBMNhJyELVYkdEREQkPQY7CakGTzDZERERkREw2EmIExQTERGRMTHYSYjT2BEREZExMdhJSPaszY4tdkRERGQMDHYSYosdERERGRODnYRkylGxTHZERERkBCYNdkePHsWAAQNQs2ZNyGQyBAQEFLl/UFAQZDJZga/Y2FjjFKwn1coTTHZERERkBCYNdmlpaWjdujVWrFih13Hh4eGIiYlRfdWoUUOiCktHeSmWiIiIyBisTPngffr0QZ8+ffQ+rkaNGnBxcTF8QQZmwUuxREREZETlso9dmzZt4OHhgVdffRUnTpwwdTmFej54gsmOiIiIpGfSFjt9eXh4YPXq1Wjfvj2ysrLw22+/oXv37jhz5gxeeOEFrcdkZWUhKytLdTs5OdlY5aqwxY6IiIiMoVwFu8aNG6Nx48aq2126dMHt27fxww8/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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# --- Evaluate ---\n",
    "logits = predict_logits_ttml(model, x_test)\n",
    "probs = softmax(logits, axis=1)\n",
    "y_pred = np.argmax(probs, axis=1).astype(np.int32)\n",
    "acc = accuracy(y_pred, y_test)\n",
    "print(f\"Test accuracy: {acc*100:.2f}%\")\n",
    "\n",
    "# --- Loss plot ---\n",
    "plt.figure()\n",
    "plt.plot(np.arange(1, len(losses)+1), losses)\n",
    "plt.xlabel(\"Training step\")\n",
    "plt.ylabel(\"Cross-Entropy Loss\")\n",
    "plt.title(\"Training Loss (TTML, MNIST)\")\n",
    "plt.tight_layout()\n",
    "plt.show()\n",
    "\n",
    "# --- Prediction grid ---\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "a1bde313",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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Bg0aWNrTkztSicWd17RVGTNmFBGRO3fuOPW4kJAQqVOnjqVah8Ph0X9TCQA8iSYHgM9r166ddO/eXS5fviwNGzaU4OBgy48dOXKk1KhRQ2bNmuXU457ImDGj1K1bV+rWrSupUqWSBQsWyIEDB6R69epOr6Xi7+9v6YtK1Y/bxcfHS926deVf//qX8jFPj/1Nrqz8+Fn27NklPDxctmzZIps2bZJNmzbJvHnzpFOnTgmjoVWevOfp6YYpsbjzmraiYMGCEhAQIL/88otH133arVu3En5MEgB8DT+uBsDntWjRQvz8/GT//v1O/1hP9erVpUaNGjJhwgSnJ609r3z58iIi8scff7i1jqe8/PLLEhMTI3Xq1FH+evKG83z58skff/whMTExzzz+1KlTlq4RHx//wvdeWP2Ofr58+UyvferUqYQ/d1bq1KmlSZMmMn36dDlz5oz06NFDFi5cKBEREaaPyZs3r6RLl05+//13l67pDnde01YEBgZKrVq1ZPfu3XL+/HmPr//48WM5f/78M/8mFAD4EpocAD7PbrfLjBkzZNSoUQn/nokznrw35+mJXGbu3bsn+/btU/7Zpk2bRMTaj3klhlatWsm+fftky5Ythj+7ffu2PH78WET+92+zPH78+JlJc3FxcTJt2rQXXqN58+bi5+cnY8aMMYylfvrHvNKnT68cSf288uXLS/bs2WXmzJny8OHDhHzTpk1y8uRJady48QvXeN6T99Y84efnl/CPsD59jeelSpVKypcvLwcPHnT6mu5y9zVtxciRI8XhcEjHjh0NDa6IyKFDh/7yTtdfOXHihDx48EAqVark7jYBwCv4cTUAyYLVcccq1atXl+rVq0tYWNgLa+/duyeVKlWSv//979KgQQPJkyeP3L59W9asWSN79uyR5s2bS5kyZVzeiycNHDhQ1q5dK6GhodK5c2cpV66c3L17V3755RdZsWKFREZGStasWaVJkyZSuXJlGTx4sERGRkqxYsVk1apVEh0d/cJrFCxYUIYNGyZjx46VqlWrSsuWLSVNmjTy3//+V3Lnzi2ffPKJiIiUK1dOZsyYIR999JEULFhQsmfPLrVq1TKslypVKpkwYYJ06dJFqlevLm3btpUrV67I559/Lvnz55f333/f6Y9Dt27d5ObNm1KrVi0JCQmRc+fOybRp06R06dIvvNPQrFkzGTZs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",
      "text/plain": [
       "<Figure size 880x880 with 16 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def show_predictions_grid(\n",
    "    images_flat: np.ndarray,\n",
    "    true_labels: np.ndarray,\n",
    "    pred_labels: np.ndarray,\n",
    "    n: int = 16,\n",
    "):\n",
    "    n = min(n, images_flat.shape[0])\n",
    "    idx = np.random.choice(images_flat.shape[0], n, replace=False)\n",
    "    imgs = images_flat[idx].reshape(n, IMG_H, IMG_W)\n",
    "    trues = true_labels[idx]\n",
    "    preds = pred_labels[idx]\n",
    "\n",
    "    side = int(math.ceil(math.sqrt(n)))\n",
    "    plt.figure(figsize=(side*2.2, side*2.2))\n",
    "    for i in range(n):\n",
    "        ax = plt.subplot(side, side, i + 1)\n",
    "        ax.imshow(imgs[i], cmap=\"gray\")\n",
    "        ax.set_title(f\"T:{trues[i]}  P:{preds[i]}\", fontsize=9)\n",
    "        ax.axis(\"off\")\n",
    "    plt.suptitle(\"MNIST Predictions (TTML CE)\")\n",
    "    plt.tight_layout(rect=[0, 0.03, 1, 0.95])\n",
    "    plt.show()\n",
    "\n",
    "show_predictions_grid(x_test, y_test, y_pred, n=16)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".tenstorrent-venv (3.10.12)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.12"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
